package com.da.ioc.frame.util;

import java.io.File;
import java.util.List;
import java.util.Objects;
import java.util.concurrent.CopyOnWriteArrayList;

/**
 * 文件扫描类,用来扫描出所有的class文件
 */
public class FileScan {

    //    文件扫描根路径
    private final String rootPath;

    //    保存所有class文件的线程安全的List
    private final List<String> classPath = new CopyOnWriteArrayList<>();

    public FileScan(String rootPath) {
        this.rootPath = rootPath;
//        获取要扫描的文件根路径
        final File filePath = init();
//        获取所有的.class文件
        getClassFiles(filePath);

    }

    private File init() {
//        替换.为/
        String path = rootPath.replaceAll("\\.", "/");
//        返回获取要扫描的根路径
        return new File(Objects.requireNonNull(this.getClass().getClassLoader().getResource(path)).getFile());
    }

    private void getClassFiles(File rootFile) {
//        判断当前是不是一个文件夹
        if (rootFile.isDirectory()) {
            for (File file : Objects.requireNonNull(rootFile.listFiles())) {
//                判断file是不是一个文件夹,是就递归扫描
                if (file.isDirectory()) {
                    getClassFiles(file);
                } else {
//                    添加class文件到List中
                    addClassFile(file);
                }
            }
        } else {
//            添加class文件到List中
            addClassFile(rootFile);
        }
    }

    private void addClassFile(File file) {
        final String classFilePath = file.getAbsolutePath();
//        获取不是frame文件夹下的所有class文件
        if (!classFilePath.contains("frame") && classFilePath.contains("class")) {
//            添加到集合中
            classPath.add(classFilePath);
        }
    }

    //    返回class文件List
    public List<String> getList() {
        return this.classPath;
    }

}
